#include <iostream>
#include <string>

// 静态成员变量
// 所有对象共享同一份数据，节省内存空间
// 编译时分配内存，程序运行前就存在
// 类内声明，类外初始化


class Person
{
public:
    static int m_A;
};

int Person::m_A = 100;  // 类外初始化

void test01()
{
    Person p1;
    std::cout << p1.m_A << std::endl;
    Person p2;
    p2.m_A = 200;
    std::cout << p1.m_A << std::endl;   // 200说明，静态成员变量被所有对象共享
}

void test02()
{
    // 两种访问静态成员变量的方式
    // 1.通过对象访问
    Person p1;
    std::cout << p1.m_A << std::endl;
    // 2.通过类名访问
    std::cout << Person::m_A << std::endl;
    // 私有权限无法通过类名访问
}

// 静态成员函数
// 所有对象共享同一份函数，节省内存空间
// 编译时分配内存，程序运行前就存在
// 类内声明，类外实现
// 静态成员函数只能访问静态成员变量
class Student
{
public:
    static void func()
    {
        // 静态成员函数只能访问静态成员变量
        std::cout << m_B << std::endl;
        std::cout << "static func called!" << std::endl;
    }
    static int m_B;
};

int Student::m_B = 300;

void test03()
{
    Student s;
    s.func();
    Student::func();
}

int main()
{
  //test01();
    test03();
    return 0;
}